package com.redmoon.oa.visual;

import cn.js.fan.util.ErrMsgException;
import cn.js.fan.util.StrUtil;
import cn.js.fan.web.Global;
import com.alibaba.fastjson.JSONObject;
import com.cloudweb.oa.api.IFuncUtil;
import com.cloudweb.oa.utils.SpringUtil;
import com.cloudwebsoft.framework.util.LogUtil;
import com.redmoon.oa.base.IFormDAO;
import com.redmoon.oa.base.IFuncImpl;
import com.redmoon.oa.dept.DeptDb;
import com.redmoon.oa.flow.FormDb;
import com.redmoon.oa.flow.FormField;

public class FuncUtil {
	
	/**
	 * 解析方法名
	 * @param funcStr
	 * @return
	 */
	public static String[] parseFunc(String funcStr) {
		IFuncUtil iFuncUtil = SpringUtil.getBean(IFuncUtil.class);
		return iFuncUtil.parseFunc(funcStr);
	}
	
	/**
	 * 判断是否含有函数或表达式
	 * @Description: 
	 * @param str
	 * @return
	 */
	public static boolean hasFunc(String str) {
		if (str==null || "".equals(str)) {
			return false;
		}
		if (parseFunc(str)!=null) {
			return true;
		}
		else {
			// 判断其中是否有加减乘除
			return str.indexOf("+") > 0 || str.indexOf("-") > 0 || str.indexOf("*") > 0 || str.indexOf("/") > 0;
		}
	}
	
	/**
	 * 调用方法呈现字段，如处理人事列表中的年龄字段（已弃用），改为在年龄默认值中用$Age(csrq)实现展现，同时便于导出
	 * @param funcStr
	 * @param ff
	 * @return
	 */
	public static String render(FormField ff, String funcStr, IFormDAO fdao) {
		IFuncUtil iFuncUtil = SpringUtil.getBean(IFuncUtil.class);
		return iFuncUtil.render(ff, funcStr, fdao);
	}
	
	/**
	 * 显示经过处理的字段值
	 * @param fdao
	 * @param ff
	 * @return
	 */
	public static String renderFieldValue(IFormDAO fdao, FormField ff) {
		if (ff == null) {
			return "";
		}

		if (!ff.isFunc()) {
			return ff.convertToHtml();
		}
		
		String dv = ff.getDefaultValueRaw();
		return render(ff, dv, fdao);
	}

	/**
	 * 取得算式的参数中关联的表单域，以逗号分隔
	 * @Description:
	 * @param ff
	 * @return
	 */
	public static String getFieldsRelatedOnChange(FormDb fd, FormField ff) {
		IFuncUtil iFuncUtil = SpringUtil.getBean(IFuncUtil.class);
		return iFuncUtil.getFieldsRelatedOnChange(fd, ff);
	}

	public static String doGetFieldsRelatedOnChangeJS(FormDb fd) {
		StringBuilder str = new StringBuilder("<script>\n");
		for (FormField ff : fd.getFields()) {
			if (ff.isFunc()) {
				str.append("bindFuncFieldRelateChangeEvent(\"" + fd.getCode() + "\", \"" + ff.getName() + "\", \"" + getFieldsRelatedOnChange(fd, ff) + "\");\n");
			}
		}
		str.append("</script>\n");
		return str.toString();
	}

	/**
	 * 取得手机端需用到的算式相关的字段json数组
	 * @param fd
	 * @return
	 */
	public static com.alibaba.fastjson.JSONArray doGetFieldsRelatedOnChangeMobile(FormDb fd) {
		com.alibaba.fastjson.JSONArray ary = new com.alibaba.fastjson.JSONArray();
		for (FormField ff : fd.getFields()) {
			if (ff.isFunc()) {
				JSONObject json = new JSONObject();
				json.put("formCode", fd.getCode());
				json.put("field", ff.getName());
				json.put("relateFields", getFieldsRelatedOnChange(fd, ff));
				ary.add(json);
			}
		}
		return ary;
	}
}
